package com.woniu.teachmall.service;

import com.woniu.teachmall.dto.CarItem;
import com.woniu.teachmall.mapper.CarMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * 购物车核心服务
 * 处理商品添加、数量更新、价格计算等购物车核心逻辑
 */
@Service
public class ShopcarService {
    // 购物车数据访问接口
    @Autowired
    private CarMapper shopcarMapper;

    /**
     * 添加商品到购物车（核心业务逻辑）
     * @param userid 用户ID
     * @param goodid 商品ID
     * @param num 商品数量
     * @return 操作是否成功
     * @implNote 1.存在则追加数量 2.不存在则创建新记录
     */
    public boolean addCar(int userid, int goodid, int num) {
        // 检查商品是否已存在购物车
        int gooditemid = this.getGoodItemIdBygoodId(userid, goodid);

        if (gooditemid != -1) {
            // 存在相同商品：执行数量追加
            shopcarMapper.appendNum(num, userid, goodid);
            return true;
        } else {
            // 新增商品项逻辑
            if (this.addGoodItem(userid, goodid, num)) {
                // 获取新增的商品项ID
                int newgooditemid = this.getGoodItemId(userid, goodid);
                // 关联到用户购物车
                return shopcarMapper.addCar(userid, newgooditemid) > 0;
            }
        }
        return false;
    }

    /**
     * 创建新的购物车商品项
     * @param userid 用户ID
     * @param goodid 商品ID
     * @param num 初始数量
     * @return 创建是否成功
     */
    public boolean addGoodItem(int userid, int goodid, int num) {
        return shopcarMapper.addGoodItem(userid, goodid, num) > 0;
    }

    /**
     * 获取商品项唯一标识
     * @param userid 用户ID
     * @param goodid 商品ID
     * @return 商品项ID（不存在返回-1）
     */
    public int getGoodItemId(int userid, int goodid) {
        return shopcarMapper.getGoodItemId(userid, goodid);
    }

    /**
     * 获取完整购物车数据
     * @param userid 用户ID
     * @return 购物车商品项集合（含价格等详细信息）
     */
    public List<CarItem> getCar(int userid) {
        return shopcarMapper.findCarByUserId(userid);
    }

    /**
     * 检查商品是否存在购物车
     * @param userid 用户ID
     * @param goodid 商品ID
     * @return 存在返回商品项ID，不存在返回-1
     */
    public Integer getGoodItemIdBygoodId(int userid, int goodid) {
        Integer gooditemid = shopcarMapper.getGoodItemIdBygoodId(userid, goodid);
        return gooditemid == null ? -1 : gooditemid;
    }

    /**
     * 计算购物车总金额
     * @param userid 用户ID
     * @return 总价格（保留两位小数）
     */
    public Double getTotalPrice(int userid) {
        List<CarItem> car = this.getCar(userid);
        Double totalPrice = 0.0;
        // 遍历计算商品小计
        for (CarItem carItem : car) {
            totalPrice += carItem.getGoodprice() * carItem.getNum();
        }
        return totalPrice;
    }

    /**
     * 清空用户购物车（级联操作）
     * @param userId 用户ID
     * @apiNote 同时清除购物车关联和商品项记录
     */
    public void clearCar(Integer userId) {
        shopcarMapper.clearCar(userId);    // 清除关联关系
        shopcarMapper.clearCarItem(userId); // 清除商品项
    }
}